home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / P3SRC.ZIP / ATARI / VIDEL.S < prev    next >
Encoding:
Text File  |  1997-01-29  |  19.9 KB  |  938 lines

  1.  
  2.     OPT        P=68030,O+,L2,W-
  3.  
  4.     xdef        _V_Init,_V_Close,_V_Fin
  5.     xdef        _V_Plot,_V_Rect,_V_Box
  6.     xdef        _get_200
  7.     
  8. clip_x1            =    0
  9. clip_y1            =    2
  10. clip_x2            =    4
  11. clip_y2            =    6
  12. clip_slen        =    8
  13.  
  14. true_bit        =    2
  15. hires_bit        =    3
  16. vga_bit            =    4
  17. pal_bit            =    5
  18. os_bit            =    6
  19. compat_bit        =    7
  20. lace_bit        =    8
  21.  
  22. bpl1            =    0
  23. bpl2            =    1
  24. bpl4            =    2
  25. bpl8            =    3
  26. true            =    4
  27.  
  28. hires            =    1<<hires_bit
  29. vga            =    1<<vga_bit
  30. pal            =    1<<pal_bit
  31. os            =    1<<os_bit
  32. compat            =    1<<compat_bit
  33. lace            =    1<<lace_bit
  34.  
  35.  
  36. push            macro
  37.     move.\0        \1,-(sp)
  38.     endm
  39.     
  40. pop                macro
  41.     move.\0        (sp)+,\1
  42.     endm
  43.  
  44. pushall            macro
  45.     movem.l        d0-a6,-(sp)
  46.     endm
  47.     
  48. popall            macro
  49.     movem.l        (sp)+,d0-a6
  50.     endm
  51.  
  52. *---------------------------------------*
  53. *    Initialise rendering display        *
  54. *---------------------------------------*
  55. _V_Init:
  56. *---------------------------------------*
  57.     pushall
  58. *---------------------------------------*
  59.                 rsreset
  60. *---------------------------------------*
  61. .local_regs        rs.l    15
  62. *---------------------------------------*
  63. .local_rts        rs.l    1
  64. *---------------------------------------*
  65.                 rs.w    1
  66. .local_width    rs.w    1
  67. *---------------------------------------*
  68.                 rs.w    1
  69. .local_height    rs.w    1
  70. *---------------------------------------*
  71. .local_options    rs.l    1
  72. *---------------------------------------*
  73.                 rs.b    3
  74. .local_format    rs.b    1
  75. *---------------------------------------*
  76.     move.w        .local_width(sp),render_width
  77.     move.w        .local_height(sp),render_height
  78.     move.l        .local_options(sp),render_options
  79.     move.b        .local_format(sp),render_format
  80. *---------------------------------------*
  81. *    Start screen blanker                *
  82. *---------------------------------------*
  83.     tst.l        render_options
  84.     beq.s        .cont
  85. *---------------------------------------*
  86.     tst.b        blanker_active
  87.     bne            .error
  88.     st            blanker_active
  89. *---------------------------------------*
  90.     push.w        #37
  91.     trap        #14
  92.     addq.l        #2,sp
  93.     pea            blanker_on
  94.     push.w        #38
  95.     trap        #14
  96.     addq.l        #6,sp
  97. *---------------------------------------*
  98.     bra            .error
  99. *---------------------------------------*
  100. .cont:
  101. *---------------------------------------*
  102. *    320x200/320x240                        *
  103. *---------------------------------------*
  104.     move.w        #true,default_modecode
  105. *---------------------------------------*
  106.     cmp.b        #'H',render_format
  107.     beq.s        .hig
  108.     cmp.b        #'h',render_format
  109.     beq.s        .hig
  110.     cmp.b        #'M',render_format
  111.     beq.s        .med
  112.     cmp.b        #'m',render_format
  113.     bne.s        .low
  114. *---------------------------------------*
  115. .med:
  116. *---------------------------------------*
  117. *    320x400/320x480                        *
  118. *---------------------------------------*
  119.     move.w        #true|lace,default_modecode
  120.     bra.s        .low
  121. *---------------------------------------*
  122. .hig:
  123. *---------------------------------------*
  124. *    640x400/640x480                        *
  125. *---------------------------------------*
  126.     move.w        #true|lace|hires,default_modecode
  127. *---------------------------------------*
  128. .low:
  129. *---------------------------------------*
  130.     bsr            flush_keybuffer
  131. *---------------------------------------*
  132.     tst.b        display_active
  133.     bne            .error
  134. *---------------------------------------*
  135. *    Disable cursor                        *
  136. *---------------------------------------*
  137.     pea            con_init
  138.     push.w        #9
  139.     trap        #1
  140.     addq.l        #6,sp
  141. *---------------------------------------*
  142. *    Store original screen config        *
  143. *---------------------------------------*
  144.     push.w        #2
  145.     trap        #14
  146.     addq.l        #2,sp
  147.     move.l        d0,os_screen
  148.     push.w        #-1
  149.     push.w        #88
  150.     trap        #14
  151.     addq.l        #4,sp
  152.     move.w        d0,os_modecode
  153.     push.w        d0
  154.     push.w        #91
  155.     trap        #14
  156.     addq.l        #4,sp
  157.     move.l        d0,os_screen_size
  158. *---------------------------------------*
  159. *    Store original palette                *
  160. *---------------------------------------*
  161.     bsr            save_palette
  162. *---------------------------------------*
  163. *    Choose new video modecode            *
  164. *---------------------------------------*
  165.     move.w        #vga|pal,d0
  166.     move.w        d0,d1
  167.     not.w        d0
  168.     and.w        os_modecode,d1
  169.     and.w        default_modecode,d0
  170.     or.w        d1,d0
  171.     btst        #vga_bit,d0
  172.     beq.s        .nvga
  173.     bclr        #pal_bit,d0
  174.     eor.w        #lace,d0
  175. .nvga:
  176.     move.w        d0,modecode
  177. *---------------------------------------*
  178. *    Allocate space for screen            *
  179. *---------------------------------------*
  180.     push.w        d0
  181.     push.w        #91
  182.     trap        #14
  183.     addq.l        #4,sp
  184.     move.l        d0,phys_size
  185.     add.l        #(256+256),d0
  186.     push.w        #0
  187.     push.l        d0
  188.     push.w        #68
  189.     trap        #1
  190.     addq.l        #8,sp
  191.     tst.l        d0
  192.     beq            .error
  193.     move.l        d0,phys_handle
  194.     add.l        #256-1,d0
  195.     clr.b        d0
  196.     move.l        d0,phys_screen
  197. *---------------------------------------*
  198. *    Clear screen                        *
  199. *---------------------------------------*
  200.     move.l        d0,a0
  201.     move.l        phys_size,d0
  202.     lsr.l        #2,d0
  203.     bsr            clear_longs
  204. *---------------------------------------*
  205. *    Switch to new video mode            *
  206. *---------------------------------------*
  207.     move.l        phys_screen,a0
  208.     move.w        modecode,d0
  209.     jsr            set_video
  210. *---------------------------------------*
  211. *    Work out screen dimensions            *
  212. *---------------------------------------*
  213.     jsr            get_width
  214. *---------------------------------------*
  215. *    Calculate plotting dimensions        *
  216. *---------------------------------------*
  217.     clr.b        hscale
  218.     clr.b        vscale
  219. *---------------------------------------*
  220.     move.w        screen_w,d1
  221.     move.w        screen_h,d2
  222.     swap        d1
  223.     swap        d2
  224.     clr.w        d1
  225.     clr.w        d2
  226.     divu.w        #160,d1
  227.     divu.w        #120,d2
  228.     swap        d2
  229.     move.w        d2,d0
  230.     clr.w        d2
  231.     ext.l        d0
  232.     divu.l        d1,d0:d2
  233.     cmp.l        #$00018000,d2
  234.     bmi.s        .square
  235.     addq.b        #1,hscale
  236. *---------------------------------------*
  237. .square:
  238. *---------------------------------------*
  239.     moveq        #0,d3
  240.     moveq        #0,d4
  241.     move.b        hscale,d3
  242.     move.b        vscale,d4
  243.     move.w        render_width,d1
  244.     lsr.w        d3,d1
  245.     move.w        render_height,d2
  246.     lsr.w        d4,d2
  247. .loop:
  248.     cmp.w        screen_w,d1
  249.     ble.s        .x_in
  250.     addq.b        #1,hscale
  251.     addq.b        #1,vscale
  252.     lsr.w        d1
  253.     lsr.w        d2
  254.     bra.s        .loop
  255. .x_in:
  256.     cmp.w        screen_h,d2
  257.     ble.s        .y_in
  258.     addq.b        #1,hscale
  259.     addq.b        #1,vscale
  260.     lsr.w        d1
  261.     lsr.w        d2
  262.     bra.s        .loop
  263. .y_in:
  264.     lea            clipping_window,a1
  265.     move.w        #0,clip_x1(a1)
  266.     move.w        #0,clip_y1(a1)
  267.     move.w        d1,clip_x2(a1)
  268.     move.w        d2,clip_y2(a1)
  269. *---------------------------------------*
  270. *    Calculate centering                    *
  271. *---------------------------------------*
  272.     neg.w        d1
  273.     add.w        screen_w,d1
  274.     lsr.w        d1
  275.     neg.w        d2
  276.     add.w        screen_h,d2
  277.     lsr.w        d2
  278.     mulu.w        linelen,d2
  279.     ext.l        d1
  280.     add.l        d1,d2
  281.     add.l        d2,d2
  282.     move.l        phys_screen,a1
  283.     add.l        d2,a1
  284.     move.l        a1,plot_screen
  285. *---------------------------------------*
  286.     st            display_active
  287. *---------------------------------------*
  288. .error:
  289. *---------------------------------------*
  290.     popall
  291. *---------------------------------------*
  292.     rts
  293.  
  294. *---------------------------------------*
  295. blanker_on:
  296. *---------------------------------------*
  297.     move.w        $FFFF82A4.w,old_v1
  298.     move.w        $FFFF82A6.w,old_v2
  299.     move.w        $FFFF82A8.w,old_v3
  300.     move.w        $FFFF82A2.w,$FFFF82A4.w
  301.     move.w        $FFFF82A2.w,$FFFF82A6.w
  302.     move.w        #-1,$FFFF82A8.w
  303.     rts
  304.  
  305. *---------------------------------------*
  306. blanker_off:
  307. *---------------------------------------*
  308.     move.w        old_v1,$FFFF82A4.w
  309.     move.w        old_v2,$FFFF82A6.w
  310.     move.w        old_v3,$FFFF82A8.w
  311.     rts
  312.     
  313. *---------------------------------------*
  314. _V_Close:
  315. *---------------------------------------*
  316.     pushall
  317. *---------------------------------------*
  318.     bsr            flush_keybuffer
  319. *---------------------------------------*
  320. *    Check screenblanker                    *
  321. *---------------------------------------*
  322.     tst.b        blanker_active
  323.     beq.s        .cont
  324.     sf            blanker_active
  325. *---------------------------------------*
  326.     push.w        #37
  327.     trap        #14
  328.     addq.l        #2,sp
  329.     pea            blanker_off
  330.     push.w        #38
  331.     trap        #14
  332.     addq.l        #6,sp
  333. *---------------------------------------*
  334.     bra.s        .error
  335. *---------------------------------------*
  336. .cont:
  337. *---------------------------------------*
  338.     tst.b        display_active
  339.     beq            .error
  340.     sf            display_active
  341. *---------------------------------------*
  342.     move.l        os_screen,a0
  343.     move.w        os_modecode,d0
  344.     bsr            set_video
  345. *---------------------------------------*
  346.     bsr            restore_palette
  347. *---------------------------------------*
  348.     push.l        phys_handle
  349.     push.w        #73
  350.     trap        #1
  351.     addq.l        #6,sp
  352. *---------------------------------------*
  353. *    Reset console                        *
  354. *---------------------------------------*
  355.     pea            con_reset
  356.     push.w        #9
  357.     trap        #1
  358.     addq.l        #6,sp
  359. *---------------------------------------*
  360. .error:
  361. *---------------------------------------*
  362.     popall
  363. *---------------------------------------*
  364.     rts
  365.     
  366. *---------------------------------------*
  367. _V_Fin:
  368. *---------------------------------------*
  369.     pushall
  370.     push.w        #7
  371.     trap        #1
  372.     addq.l        #2,sp
  373.     popall
  374.     rts
  375.  
  376. *---------------------------------------*
  377. _V_Plot:
  378. *---------------------------------------*
  379.     movem.l        d0-d2/a0,-(sp)
  380. *---------------------------------------*
  381.                 rsreset
  382. *---------------------------------------*
  383. .local_regs        rs.l    4
  384. *---------------------------------------*
  385. .local_rts        rs.l    1
  386. *---------------------------------------*
  387.                 rs.w    1
  388. .local_x        rs.w    1
  389. *---------------------------------------*
  390.                 rs.w    1
  391. .local_y        rs.w    1
  392. *---------------------------------------*
  393.                 rs.b    3
  394. .local_r        rs.b    1
  395. *---------------------------------------*
  396.                 rs.b    3
  397. .local_g        rs.b    1
  398. *---------------------------------------*
  399.                 rs.b    3
  400. .local_b        rs.b    1
  401. *---------------------------------------*
  402.     move.w        .local_x(sp),d0
  403.     move.b        hscale,d2
  404.     lsr.w        d2,d0
  405.     move.w        .local_y(sp),d1
  406.     move.b        vscale,d2
  407.     lsr.w        d2,d1
  408.     mulu.w        linelen,d1
  409.     ext.l        d0
  410.     move.l        plot_screen,a0
  411.     add.l        d1,d0
  412.     move.b        .local_r(sp),d2
  413.     bfins        d2,d1{16:08}
  414.     move.b        .local_g(sp),d2
  415.     bfins        d2,d1{21:08}
  416.     move.b        .local_b(sp),d2
  417.     bfins        d2,d1{27:08}
  418.     move.w        d1,(a0,d0.l*2)
  419. *---------------------------------------*
  420.     movem.l        (sp)+,d0-d2/a0
  421.     rts
  422.  
  423. *---------------------------------------*
  424. _V_Rect:
  425. *---------------------------------------*
  426.     pushall
  427. *---------------------------------------*
  428.                 rsreset
  429. *---------------------------------------*
  430. .local_regs        rs.l    15
  431. *---------------------------------------*
  432. .local_rts        rs.l    1
  433. *---------------------------------------*
  434.                 rs.w    1
  435. .local_x1        rs.w    1
  436. *---------------------------------------*
  437.                 rs.w    1
  438. .local_x2        rs.w    1
  439. *---------------------------------------*
  440.                 rs.w    1
  441. .local_y1        rs.w    1
  442. *---------------------------------------*
  443.                 rs.w    1
  444. .local_y2        rs.w    1
  445. *---------------------------------------*
  446.                 rs.b    3
  447. .local_r        rs.b    1
  448. *---------------------------------------*
  449.                 rs.b    3
  450. .local_g        rs.b    1
  451. *---------------------------------------*
  452.                 rs.b    3
  453. .local_b        rs.b    1
  454. *---------------------------------------*
  455.     move.w        .local_x1(sp),d1
  456.     move.w        .local_y1(sp),d2
  457.     move.w        .local_x2(sp),d3
  458.     move.w        .local_y2(sp),d4
  459.     move.b        .local_r(sp),red
  460.     move.b        .local_g(sp),grn
  461.     move.b        .local_b(sp),blu
  462.     move.b        hscale,d0
  463.     lsr.w        d0,d1
  464.     lsr.w        d0,d3
  465.     move.b        vscale,d0
  466.     lsr.w        d0,d2
  467.     lsr.w        d0,d4
  468.     addq.w        #1,d3
  469.     addq.w        #1,d4
  470.     lea            clipping_window,a1
  471.     bsr            sbox_clipped
  472.     popall
  473.     rts
  474.  
  475. *---------------------------------------*
  476. _V_Box:
  477. *---------------------------------------*
  478.     pushall
  479. *---------------------------------------*
  480.                 rsreset
  481. *---------------------------------------*
  482. .local_regs        rs.l    15
  483. *---------------------------------------*
  484. .local_rts        rs.l    1
  485. *---------------------------------------*
  486.                 rs.w    1
  487. .local_x1        rs.w    1
  488. *---------------------------------------*
  489.                 rs.w    1
  490. .local_y1        rs.w    1
  491. *---------------------------------------*
  492.                 rs.w    1
  493. .local_x2        rs.w    1
  494. *---------------------------------------*
  495.                 rs.w    1
  496. .local_y2        rs.w    1
  497. *---------------------------------------*
  498.                 rs.b    3
  499. .local_r        rs.b    1
  500. *---------------------------------------*
  501.                 rs.b    3
  502. .local_g        rs.b    1
  503. *---------------------------------------*
  504.                 rs.b    3
  505. .local_b        rs.b    1
  506. *---------------------------------------*
  507.     move.w        .local_x1(sp),d1
  508.     move.w        .local_y1(sp),d2
  509.     move.w        .local_x2(sp),d3
  510.     move.w        .local_y2(sp),d4
  511.  
  512.     move.b        .local_r(sp),red
  513.     move.b        .local_g(sp),grn
  514.     move.b        .local_b(sp),blu
  515.  
  516.     move.b        hscale,d0
  517.     lsr.w        d0,d1
  518.     lsr.w        d0,d3
  519.     
  520.     move.b        vscale,d0
  521.     lsr.w        d0,d2
  522.     lsr.w        d0,d4
  523.  
  524.     subq.l        #clip_slen,sp
  525.     move.w        d1,clip_x1(sp)
  526.     move.w        d2,clip_y1(sp)
  527.     move.w        d3,clip_x2(sp)
  528.     move.w        d4,clip_y2(sp)
  529.  
  530.     lea            clipping_window,a1
  531.     
  532.     move.w        clip_x1(sp),d1
  533.     move.w        d1,d3
  534.     move.w        clip_y1(sp),d2
  535.     move.w        clip_y2(sp),d4
  536.     addq.w        #1,d3
  537.     addq.w        #1,d4
  538.     bsr            sbox_clipped
  539.  
  540.     move.w        clip_x2(sp),d1
  541.     move.w        d1,d3
  542.     move.w        clip_y1(sp),d2
  543.     move.w        clip_y2(sp),d4
  544.     addq.w        #1,d3
  545.     addq.w        #1,d4
  546.     bsr            sbox_clipped
  547.  
  548.     move.w        clip_x1(sp),d1
  549.     move.w        clip_x2(sp),d3
  550.     move.w        clip_y1(sp),d2
  551.     move.w        d2,d4
  552.     addq.w        #1,d3
  553.     addq.w        #1,d4
  554.     bsr            sbox_clipped
  555.  
  556.     move.w        clip_x1(sp),d1
  557.     move.w        clip_x2(sp),d3
  558.     move.w        clip_y2(sp),d2
  559.     move.w        d2,d4
  560.     addq.w        #1,d3
  561.     addq.w        #1,d4
  562.     bsr            sbox_clipped
  563.  
  564.     addq.l        #clip_slen,sp
  565.     
  566.     popall
  567.     rts
  568.     
  569. *---------------------------------------*
  570. save_palette:
  571. *---------------------------------------*
  572.     move.w        os_modecode,d0
  573.     btst        #true_bit,d0
  574.     bne.s        .err
  575.     and.w        #%111,d0
  576.     moveq        #2,d1
  577.     bra.s        .strt
  578. .shft:
  579.     mulu.w        d1,d1
  580. .strt:
  581.     dbra        d0,.shft
  582.     pea            os_palette
  583.     push.w        d1
  584.     push.w        #0
  585.     push.w        #94
  586.     trap        #14
  587.     lea            10(sp),sp
  588. .err:
  589.     rts
  590.  
  591. *---------------------------------------*
  592. restore_palette:
  593. *---------------------------------------*
  594.     move.w        os_modecode,d0
  595.     btst        #true_bit,d0
  596.     bne.s        .err
  597.     and.w        #%111,d0
  598.     moveq        #2,d1
  599.     bra.s        .strt
  600. .shft:
  601.     mulu.w        d1,d1
  602. .strt:
  603.     dbra        d0,.shft
  604.     pea            os_palette
  605.     push.w        d1
  606.     push.w        #0
  607.     push.w        #93
  608.     trap        #14
  609.     lea            10(sp),sp
  610. .err:
  611.     rts
  612.  
  613.  
  614. *---------------------------------------*
  615. *    Calculate horizontal video size        *
  616. *---------------------------------------*
  617. get_width:
  618. *---------------------------------------*
  619.     pea            .local(pc)
  620.     push.w        #38
  621.     trap        #14
  622.     addq.l        #6,sp
  623.     rts
  624. .local:
  625.     moveq        #0,d1
  626.     move.w        $FFFF8210.w,d1
  627.     move.w        d1,screen_w
  628.     move.w        d1,linelen
  629.     add.l        d1,d1
  630.     move.w        d1,linesize
  631.     move.l        phys_size,d0
  632.     divu.l        d1,d0
  633.     move.w        d0,screen_h
  634.     rts
  635.  
  636. *-------------------------------------------------------*
  637. set_video:
  638. *-------------------------------------------------------*
  639.     push.w        #-1
  640.     push.l        a0
  641.     push.l        a0
  642. *-------------------------------------------------------*
  643.     push.w        d0
  644.     push.w        #3
  645.     pea            0.w
  646.     pea            0.w
  647.     push.w        #5
  648.     trap        #14
  649.     lea            14(sp),sp
  650. *-------------------------------------------------------*
  651.     push.w        #5
  652.     trap        #14
  653.     lea            12(sp),sp
  654.  
  655. ;    push.w        d0
  656. ;    push.w        #-1
  657. ;    push.l        a0
  658. ;    push.l        a0
  659. ;    push.w        #5
  660. ;    trap        #14
  661. ;    lea            12(sp),sp
  662. ;    push.w        #88
  663. ;    trap        #14
  664. ;    addq.l        #4,sp
  665.  
  666.     rts
  667.  
  668. *---------------------------------------------------------------*
  669. clear_longs:
  670. *---------------------------------------------------------------*
  671.     movem.l        d1-d7/a2-a3,-(sp)
  672.     moveq        #0,d2
  673.     move.l        d2,d3
  674.     move.l        d2,d4
  675.     move.l        d2,d5
  676.     move.l        d2,d6
  677.     move.l        d2,d7
  678.     move.l        d2,a2
  679.     move.l        d2,a3
  680.     moveq        #128-1,d1
  681.     and.l        d0,d1
  682.     bra.s        .strt
  683. .long:
  684.     move.l        d2,(a0)+
  685. .strt:
  686.     dbra        d1,.long
  687.     lsr.l        #7,d0
  688.     move.l        d0,d1
  689.     lsl.l        #8,d1                ; *256
  690.     lsl.l        #1,d1                ; *2    =  *512
  691.     add.l        d1,a0
  692.     bra.s        .next
  693. .clr:
  694.     movem.l        d2-d7/a2-a3,-(a0)        ; 4*8*16 = 512
  695.     movem.l        d2-d7/a2-a3,-(a0)
  696.     movem.l        d2-d7/a2-a3,-(a0)
  697.     movem.l        d2-d7/a2-a3,-(a0)
  698.     movem.l        d2-d7/a2-a3,-(a0)
  699.     movem.l        d2-d7/a2-a3,-(a0)
  700.     movem.l        d2-d7/a2-a3,-(a0)
  701.     movem.l        d2-d7/a2-a3,-(a0)
  702.     movem.l        d2-d7/a2-a3,-(a0)
  703.     movem.l        d2-d7/a2-a3,-(a0)
  704.     movem.l        d2-d7/a2-a3,-(a0)
  705.     movem.l        d2-d7/a2-a3,-(a0)
  706.     movem.l        d2-d7/a2-a3,-(a0)
  707.     movem.l        d2-d7/a2-a3,-(a0)
  708.     movem.l        d2-d7/a2-a3,-(a0)
  709.     movem.l        d2-d7/a2-a3,-(a0)
  710. .next:
  711.     dbra        d0,.clr
  712.     movem.l        (sp)+,d1-d7/a2-a3
  713.     rts
  714.  
  715. *---------------------------------------*
  716. flush_keybuffer:
  717. *---------------------------------------*
  718. .all:
  719.     push.w        #11
  720.     trap        #1
  721.     addq.l        #2,sp
  722.     tst.w        d0
  723.     beq.s        .exit
  724.     push.w        #7
  725.     trap        #1
  726.     addq.l        #2,sp
  727.     bra.s        .all
  728. .exit:
  729.     rts
  730.  
  731.  
  732. *-------------------------------------------------------*
  733. sbox_clipped_end:
  734. *-------------------------------------------------------*
  735.     rts
  736.  
  737. *-------------------------------------------------------*
  738. sbox_clipped:
  739. *-------------------------------------------------------*
  740.     move.l        (a1)+,d5
  741.     cmp.w        d1,d3
  742.     bge.s        .xok
  743.     exg        d1,d3
  744. .xok:    move.l        (a1)+,d6
  745.     cmp.w        d2,d4
  746.     bge.s        .yok
  747.     exg        d2,d4
  748. .yok:    subq.l        #clip_slen,a1
  749.     swap        d5
  750.     cmp.w        d5,d3
  751.     bmi.s        sbox_clipped_end
  752.     cmp.w        d5,d1
  753.     bpl.s        .x1in
  754.     move.w        d5,d1
  755. .x1in:    swap        d5
  756.     cmp.w        d5,d4
  757.     bmi.s        sbox_clipped_end
  758.     cmp.w        d5,d2
  759.     bpl.s        .y1in
  760.     move.w        d5,d2
  761. .y1in:    swap        d6
  762.     cmp.w        d6,d1
  763.     bpl.s        sbox_clipped_end
  764.     cmp.w        d6,d3
  765.     bmi.s        .x2in
  766.     move.w        d6,d3
  767. .x2in:    swap        d6
  768.     cmp.w        d6,d2
  769.     bpl.s        sbox_clipped_end
  770.     cmp.w        d6,d4
  771.     bmi.s        .y2in
  772.     move.w        d6,d4
  773. .y2in:
  774.  
  775. *-------------------------------------------------------*
  776. sbox_primitive:
  777. *-------------------------------------------------------*
  778.     push.l        a0
  779.     push.l        a1
  780. *-------------------------------------------------------*
  781. *    Check size                    *
  782. *-------------------------------------------------------*
  783.     sub.w        d1,d3
  784.     ble        sbox_end
  785.     sub.w        d2,d4
  786.     ble        sbox_end
  787. *-------------------------------------------------------*
  788. *    Address screen location                *
  789. *-------------------------------------------------------*
  790.     move.l        plot_screen,a0
  791.     move.w        d2,d6
  792.     mulu.w        linelen,d6
  793.     ext.l        d1
  794.     add.l        d1,d6
  795.     add.l        d6,d6
  796.     add.l        d6,a0
  797. *-------------------------------------------------------*
  798. *    Calculate line-wrap increment            *
  799. *-------------------------------------------------------*
  800.     move.w        linelen,d2
  801.     sub.w        d3,d2
  802.     ext.l        d2
  803.     add.l        d2,d2
  804.     move.l        d2,a2
  805. *-------------------------------------------------------*
  806. *    Look up colour                    *
  807. *-------------------------------------------------------*
  808.     move.b        red,d1
  809.     bfins        d1,d2{16:8}
  810.     move.b        grn,d1
  811.     bfins        d1,d2{21:8}
  812.     move.b        blu,d1
  813.     bfins        d1,d2{27:8}
  814.     move.w        d2,d0
  815.     swap        d0
  816.     move.w        d2,d0
  817. *-------------------------------------------------------*
  818. *    Render filled box                *
  819. *-------------------------------------------------------*
  820.     subq.w        #1,d4
  821.     moveq        #8-1,d5
  822.     and.w        d3,d5
  823.     lsr.w        #3,d3
  824.     neg.w        d5
  825.     lea        .jmp(pc,d5.w*2),a1
  826. .olp:    move.w        d3,d2
  827.     jmp        (a1)
  828. .block:    move.l        d0,(a0)+
  829.     move.l        d0,(a0)+
  830.     move.l        d0,(a0)+
  831.     move.l        d0,(a0)+
  832.     dbra        d2,.block
  833.     add.l        a2,a0
  834.     dbra        d4,.olp
  835.     bra.s        sbox_end
  836.     move.w        d0,(a0)+
  837.     move.w        d0,(a0)+
  838.     move.w        d0,(a0)+
  839.     move.w        d0,(a0)+
  840.     move.w        d0,(a0)+
  841.     move.w        d0,(a0)+
  842.     move.w        d0,(a0)+
  843.     move.w        d0,(a0)+
  844. .jmp:    dbra        d2,.block
  845.     add.l        a2,a0
  846.     dbra        d4,.olp
  847. *-------------------------------------------------------*
  848. sbox_end:
  849. *-------------------------------------------------------*
  850.     pop.l        a1
  851.     pop.l        a0
  852.     rts
  853.  
  854. *-------------------------------------------------------*
  855. _get_200:
  856. *-------------------------------------------------------*
  857.     movem.l        d1-d2/a0-a2,-(sp)
  858.     pea        .loc
  859.     push.w        #38
  860.     trap        #14
  861.     addq.l        #6,sp
  862.     movem.l        (sp)+,d1-d2/a0-a2
  863.     move.l        clock,d0
  864.     rts
  865. .loc:    move.l        $4BA.w,clock
  866.     rts
  867.  
  868. *---------------------------------------*
  869.             cnop    0,4
  870. *---------------------------------------*
  871.             data
  872. *---------------------------------------*
  873.  
  874. con_init:        dc.b    27,"f",0
  875. con_reset:        dc.b    27,"e",0
  876.             even
  877.  
  878. default_modecode:    dc.w    true|lace
  879. display_active:        ds.w    1
  880.  
  881. *---------------------------------------*
  882.             cnop    0,4
  883. *---------------------------------------*
  884.             bss
  885. *---------------------------------------*
  886.  
  887. os_palette:        ds.l    256
  888. xb_palette:        ds.l    256
  889.  
  890. os_screen:        ds.l    1
  891. os_screen_size:        ds.l    1
  892. os_screen_clone:    ds.l    1
  893.  
  894. clock:            ds.l    1
  895.  
  896. phys_size:        ds.l    1
  897. phys_handle:        ds.l    1
  898. phys_screen:        ds.l    1
  899. plot_screen:        ds.l    1
  900.  
  901. linesize:        ds.l    1
  902.  
  903. render_format:        ds.l    1
  904. render_width:        ds.l    1
  905. render_height:        ds.l    1
  906. render_options:        ds.l    1
  907.  
  908. linelen:        ds.l    1
  909. modecode:        ds.l    1
  910. screen_w:        ds.l    1
  911. screen_h:        ds.l    1
  912.  
  913. os_modecode:        ds.l    1
  914. os_screen_w:        ds.l    1
  915. os_screen_h:        ds.l    1
  916.  
  917. hscale:            ds.l    1
  918. vscale:            ds.l    1
  919.  
  920. red:            ds.l    1
  921. grn:            ds.l    1
  922. blu:            ds.l    1
  923.  
  924. old_v1:            ds.l    1
  925. old_v2:            ds.l    1
  926. old_v3:            ds.l    1
  927.  
  928. monitor_type:        ds.l    1
  929. blanker_active:        ds.l    1
  930.  
  931. clipping_window:    ds.b    clip_slen
  932.  
  933. *---------------------------------------*
  934.             cnop    0,4
  935. *---------------------------------------*
  936.             text
  937. *---------------------------------------*
  938.